﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Tibet.GUI.Contrato;
using Tibet.Logica.Comandos;
//using Tibet.Logica.Comandos.ComandoPerfilReglas;
using Tibet.Logica.FabricaLogica;
using Tibet.Entidades;
using Tibet.Logica.Comandos.ComandoMotorRegla;//.ComandoMotorRegla;
using System.Web.UI.WebControls;
using Tibet.Entidades.FabricaEntidades;


namespace Tibet.GUI.Presentador
{
    public class PresentadorModificarPerfilRegla
    {
        private IContratoModificarPerfilReglas _vista;

        public PresentadorModificarPerfilRegla(IContratoModificarPerfilReglas laVista)
        {
            _vista = laVista;
        }

        #region
        String llaveS = "Llaves en la misma linea";
        String llaveN = "Llaves en linea nueva";
        String boilerS = "Tiene Boilerplate";
        String boilerN = "No Tiene Boilerplate";
        String espacioOpeS = "Tiene espacio entre operadores";
        String espacioOpeN = "No tiene espacio entre operadores";
        String espacioPareS = "Tiene espacio entre parentesis";
        String espacioPareN = "No tiene espacio entre parentesis";
        #endregion

        public void CargarDatos()
        {

            Comando comando = FabricaComandoRegla.ObtenerComandoConsultarReglasPorNombre();

            try
            {
                llenarNombreClase(comando);
                llenarNombreAtributo(comando);
                llenarNombreMetodo(comando);
                llenarNombrePaquete(comando);
                llenarDocumentClase(comando);
                llenarDocumentEstructura(comando);
                llenarDocumentMetodo(comando);
                llenarNombreInterfaces(comando);

            }
            catch (Exception)
            {
                System.Web.HttpContext.Current.Response.Write
                ("<script language=javascript>alert('ERROR al intentar cargar algunos datos');</script>");
            }
        }

        public void llenarBuscarPerfilRegla()
        {
            Comando comando = FabricaComandoPerfilReglas.ObtenerComandoConsultarTodosPerfiles();
            comando.Ejecutar();
            _vista.busqueda.DataSource = comando.ListaEntidad; //as ConsultarTodosPerfiles)
            _vista.busqueda.DataTextField = "NombrePerfilRegla";
            _vista.busqueda.DataValueField = "IdPerfilRegla";
            _vista.busqueda.DataBind();
        }

        public void llenarNombreClase(Comando comando)
        {
            comando.Cadena = "Nombre de clase";
            comando.Ejecutar();
            _vista.NombreDeClase.DataSource = comando.ListaEntidad;
            _vista.NombreDeClase.DataTextField = "nombreRegla";
            _vista.NombreDeClase.DataValueField = "IdRegla";
            _vista.NombreDeClase.DataBind();
        }

        public void llenarNombreAtributo(Comando comando)
        {
            comando.Cadena = "Nombre de atributo";
            comando.Ejecutar();
            _vista.NombreDeAtributo.DataSource = comando.ListaEntidad;
            _vista.NombreDeAtributo.DataTextField = "nombreRegla";
            _vista.NombreDeAtributo.DataValueField = "IdRegla";
            _vista.NombreDeAtributo.DataBind();
        }

        public void llenarNombreMetodo(Comando comando)
        {
            //llenar el DropDownList
            comando.Cadena = "Nombre de metodo";
            comando.Ejecutar();
            _vista.NombreDeMetodo.DataSource = comando.ListaEntidad;
            _vista.NombreDeMetodo.DataTextField = "nombreRegla";
            _vista.NombreDeMetodo.DataValueField = "IdRegla";
            _vista.NombreDeMetodo.DataBind();
        }

        public void llenarNombrePaquete(Comando comando)
        {
            comando.Cadena = "Nombre de paquete";
            comando.Ejecutar();
            _vista.NombreDePaquete.DataSource = comando.ListaEntidad;
            _vista.NombreDePaquete.DataTextField = "nombreRegla";
            _vista.NombreDePaquete.DataValueField = "IdRegla";
            _vista.NombreDePaquete.DataBind();
        }

        public void llenarDocumentClase(Comando comando)
        {
            comando.Cadena = "Documentacion de clase";
            comando.Ejecutar();
            _vista.DocumentacionClase.DataSource = comando.ListaEntidad;
            _vista.DocumentacionClase.DataTextField = "nombreRegla";
            _vista.DocumentacionClase.DataValueField = "IdRegla";
            _vista.DocumentacionClase.DataBind();
        }

        public void llenarDocumentEstructura(Comando comando)
        {
            comando.Cadena = "Documentacion de estructura";
            comando.Ejecutar();
            _vista.DocumentacionEstructura.DataSource = comando.ListaEntidad;
            _vista.DocumentacionEstructura.DataTextField = "nombreRegla";
            _vista.DocumentacionEstructura.DataValueField = "IdRegla";
            _vista.DocumentacionEstructura.DataBind();
        }

        public void llenarDocumentMetodo(Comando comando)
        {
            comando.Cadena = "Documentacion de metodo";
            comando.Ejecutar();
            _vista.DocumentacionMetodo.DataSource = comando.ListaEntidad;
            _vista.DocumentacionMetodo.DataTextField = "nombreRegla";
            _vista.DocumentacionMetodo.DataValueField = "IdRegla";
            _vista.DocumentacionMetodo.DataBind();
        }

        public void llenarNombreInterfaces(Comando comando)
        {
            comando.Cadena = "Nombre de interface";
            comando.Ejecutar();
            _vista.NombreDeInterface.DataSource = comando.ListaEntidad;
            _vista.NombreDeInterface.DataTextField = "nombreRegla";
            _vista.NombreDeInterface.DataValueField = "IdRegla";
            _vista.NombreDeInterface.DataBind();
        }


        /// <summary>
        /// metodo que llama al comando para validar si el username es administrador o lider y si el perfil no ha sido asignado
        /// </summary>

        public Boolean VerificarModificar(int idUsuario)
        {
            Comando com = FabricaComandoPerfilReglas.ObtenerComandoVerificarPerfil();
            com.Id = idUsuario;
            com.Cadena = _vista.busqueda.SelectedItem.Text;
            com.Ejecutar();

            return com.Flag;

        }

        /// <summary>
        /// Este metodo elimina todas las reglas asociadas a dicho perfil para tenerlo vacio y depues poder agregar nuevas
        /// reglas simulando asi una modificacion
        /// </summary>
        /// <param name="idPerfil"></param>    

        public Boolean LimpiarPerfilAnterior()
        {
            Comando comando = FabricaComandoPerfilReglas.ObtenerComandoLimpiarPerfil();
            comando.Cadena = _vista.busqueda.SelectedItem.Text;
            comando.Ejecutar();

            return comando.Flag;
        }

        /// <summary>
        /// Metodo para limpiar los valores de los combos al efectuar una seleccion de un perfil de reglas
        /// en especifico
        /// </summary>
        public void Limpiar()
        {
            _vista.NombreDeClase.Items.Clear();
            _vista.NombreDeAtributo.Items.Clear();
            _vista.NombreDeMetodo.Items.Clear();
            _vista.NombreDeInterface.Items.Clear();
            _vista.NombreDePaquete.Items.Clear();
            _vista.DocumentacionClase.Items.Clear();
            _vista.DocumentacionEstructura.Items.Clear();
            _vista.DocumentacionMetodo.Items.Clear();
            _vista.DocumentacionBoilerplate.Checked = false;
            _vista.Llave.Checked = false;
            _vista.EspacioDeOperadores.Checked = false;
            _vista.EspacioDeParentesis.Checked = false;

        }

        /// <summary>
        /// Modificar el perfil de reglas que fue seleccionado anteriormente
        /// Asigna todas las reglas seleccionadas en los combos y check box a ese perfil que se desea modificar
        /// </summary>
        /// <param name="idUsuario"></param>
        public void CrearPerfilDeReglas(int idUsuario)
        {

            Comando comando1 = FabricaComandoPerfilReglas.ObtenerComandoCrearPerfilReglaRegla();//asigna reglas al perfil
            Comando comando2 = FabricaComandoRegla.ObtenerComandoConsultarReglaPorNombreId();//obtiene los id de las reglas
            try
            {

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.NombreDeClase.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.NombreDeAtributo.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.NombreDeInterface.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.NombreDeMetodo.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.NombreDePaquete.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.DocumentacionClase.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.DocumentacionEstructura.SelectedValue.ToString());
                comando1.Ejecutar();

                comando1.Cadena = _vista.busqueda.SelectedItem.Text;
                comando1.Id = int.Parse(_vista.DocumentacionMetodo.SelectedValue.ToString());
                comando1.Ejecutar();

                CrearCheck(comando2, comando1);

            }
            catch (Exception e)
            {
                Console.WriteLine("error", e);
            }
        }

        /// <summary>
        /// agrega las reglas de los checkbox seleccionados
        /// </summary>
        /// <param name="comando2">obtiene los id de las reglas</param>
        /// <param name="comando1">agrega la regla al perfil ya creado</param>
        public void CrearCheck(Comando comando2, Comando comando1)
        {
            int idRegla = 0;
            if (_vista.Llave.Checked == true)//debo validar si este ejecutar devuelve el id de la regla, si no debo dar una excepcion              
            {
                comando2.Cadena = llaveS;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }
            else
            {
                comando2.Cadena = llaveN;
                comando2.Ejecutar();//llaves no al final de la linea 
                idRegla = comando2.Id;
            }

            comando1.Cadena = _vista.busqueda.Text;
            comando1.Id = idRegla;
            comando1.Ejecutar();

            if (_vista.DocumentacionBoilerplate.Checked == true)
            {
                comando2.Cadena = boilerS;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }
            else
            {
                comando2.Cadena = boilerN;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }

            comando1.Cadena = _vista.busqueda.SelectedItem.Text;
            comando1.Id = idRegla;
            comando1.Ejecutar();

            if (_vista.EspacioDeOperadores.Checked == true)
            {
                comando2.Cadena = espacioOpeS;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }
            else
            {
                comando2.Cadena = espacioOpeN;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }

            comando1.Cadena = _vista.busqueda.SelectedItem.Text;
            comando1.Id = idRegla;
            comando1.Ejecutar();

            if (_vista.EspacioDeParentesis.Checked == true)
            {
                comando2.Cadena = espacioPareS;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }
            else
            {
                comando2.Cadena = espacioPareN;
                comando2.Ejecutar();//llaves al final de la linea 
                idRegla = comando2.Id;
            }
            comando1.Cadena = _vista.busqueda.SelectedItem.Text;
            comando1.Id = idRegla;
            comando1.Ejecutar();

        }
    }
}